import { defineStore } from 'pinia' // 导入Pinia的defineStore函数，用于创建状态管理store
import { ref } from 'vue' // 导入Vue 3的ref函数，用于创建响应式数据
import { login as loginApi, register as registerApi } from '@/api/auth' // 导入认证相关的API函数，并重命名避免冲突

// 定义用户状态管理store，使用组合式API风格
export const useUserStore = defineStore('user', () => {
  // 响应式数据定义
  const user = ref(null) // 存储当前登录用户信息，初始值为null
  const token = ref('') // 存储JWT认证令牌，初始值为空字符串
  const isLoggedIn = ref(false) // 用户登录状态标识，初始值为false
  const loading = ref(false) // 加载状态标识，用于显示loading效果

  // 用户登录方法
  const login = async (username: string, password: string) => {
    try {
      loading.value = true // 设置加载状态为true，开始加载
      console.log('开始登录，用户名:', username) // 调试日志：记录登录开始
      
      // 调用登录API，传入用户名和密码
      const response = await loginApi({ username, password })
      
      console.log('登录响应:', response.data) // 调试日志：记录API响应数据

      // 检查登录是否成功
      if (response.data.success) {
        // 登录成功，更新状态
        token.value = response.data.token // 保存JWT令牌
        user.value = response.data.user // 保存用户信息
        isLoggedIn.value = true // 设置登录状态为true

        console.log('登录成功，用户信息:', user.value) // 调试日志：记录登录成功

        // 将认证信息保存到本地存储，实现持久化
        localStorage.setItem('token', response.data.token) // 保存令牌到localStorage
        localStorage.setItem('user', JSON.stringify(response.data.user)) // 保存用户信息到localStorage

        // 返回成功结果
        return { success: true, message: response.data.message }
      } else {
        // 登录失败，记录错误信息
        console.log('登录失败:', response.data.message) // 调试日志：记录登录失败
        return { success: false, message: response.data.message }
      }
    } catch (error: any) {
      // 捕获并处理登录过程中的异常
      console.error('登录异常:', error) // 错误日志：记录异常信息
      return { 
        success: false, 
        message: error.response?.data?.message || '登录失败，请检查网络连接' 
      }
    } finally {
      loading.value = false // 无论成功失败，都要结束加载状态
    }
  }

  // 用户注册方法
  const register = async (userData: any) => {
    try {
      loading.value = true // 设置加载状态为true
      
      // 调用注册API
      const response = await registerApi(userData)
      
      // 检查注册是否成功
      if (response.data.success) {
        return { success: true, message: response.data.message }
      } else {
        return { success: false, message: response.data.message }
      }
    } catch (error: any) {
      // 捕获并处理注册过程中的异常
      console.error('注册异常:', error) // 错误日志
      return { 
        success: false, 
        message: error.response?.data?.message || '注册失败，请检查网络连接' 
      }
    } finally {
      loading.value = false // 结束加载状态
    }
  }

  // 用户登出方法
  const logout = () => {
    // 清除所有用户相关状态
    user.value = null // 清空用户信息
    token.value = '' // 清空令牌
    isLoggedIn.value = false // 设置登录状态为false
    
    // 清除本地存储的认证信息
    localStorage.removeItem('token') // 删除localStorage中的令牌
    localStorage.removeItem('user') // 删除localStorage中的用户信息
  }

  // 加载用户信息方法（从本地存储恢复）
  const loadUserInfo = () => {
    try {
      // 从localStorage获取保存的令牌和用户信息
      const savedToken = localStorage.getItem('token') // 获取保存的令牌
      const savedUser = localStorage.getItem('user') // 获取保存的用户信息
      
      // 如果本地存储中有认证信息，则恢复状态
      if (savedToken && savedUser) {
        token.value = savedToken // 恢复令牌
        user.value = JSON.parse(savedUser) // 解析并恢复用户信息
        isLoggedIn.value = true // 设置登录状态为true
      }
    } catch (error) {
      // 如果解析失败，清除可能损坏的数据
      console.error('加载用户信息失败:', error) // 错误日志
      logout() // 调用登出方法清除数据
    }
  }

  // 初始化令牌方法（应用启动时调用）
  const initToken = () => {
    // 从localStorage获取令牌
    const savedToken = localStorage.getItem('token') // 获取保存的令牌
    if (savedToken) {
      token.value = savedToken // 恢复令牌到状态中
      isLoggedIn.value = true // 设置登录状态为true
    }
  }

  // 强制清除缓存方法（用于调试）
  const clearCache = () => {
    console.log('清除用户缓存') // 调试日志
    localStorage.removeItem('token') // 删除localStorage中的令牌
    localStorage.removeItem('user') // 删除localStorage中的用户信息
    user.value = null // 清空用户信息
    token.value = '' // 清空令牌
    isLoggedIn.value = false // 设置登录状态为false
  }

  // 初始化：应用启动时自动加载用户信息
  initToken() // 调用初始化方法

  // 返回store的公共接口
  return {
    // 状态数据
    user, // 用户信息
    token, // 认证令牌
    isLoggedIn, // 登录状态
    loading, // 加载状态
    
    // 方法
    login, // 登录方法
    register, // 注册方法
    logout, // 登出方法
    loadUserInfo, // 加载用户信息方法
    clearCache // 清除缓存方法
  }
}) 